#define _CRT_SECURE_NO_WARNINGS 1




//struct
//{
//	int a;
//	char c;
//	float f;
//}x;
//
//struct
//{
//	int a;
//	char c;
//	float f;
//}* p;
//
//int main()
//{
//	//p = &x;//err
//
//	return 0;
//}




//typedef struct
//{
//	int data;
//	Node* next;
//}Node;




//typedef struct Node
//{
//	int data;
//	struct Node* next;
//}Node;
//
//int main()
//{
//	Node n = { 0 };
//
//	return 0;
//}






//#include <stdio.h>
//
//struct SN
//{
//	char c;
//	int i;
//}sn1 = { 'q', 100 }, sn2 = { .i = 200, .c = 'w'};//全局变量
//
//struct S
//{
//	double d;
//	struct SN sn;
//	int arr[10];
//};
//
//int main()
//{
//	struct SN sn3, sn4;//局部变量
//	printf("%c %d\n", sn2.c, sn2.i);
//
//	struct S s = { 3.14, { 'a', 99 }, { 1, 2, 3 } };
//	printf("%lf %c %d\n", s.d, s.sn.c, s.sn.i);
//	int i = 0;
//
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", s.arr[i]);
//	}
//
//	return 0;
//}





//#include <stdio.h>
//#include <stddef.h>
//
//struct S1
//{
//	char c1;
//	int i;
//	char c2;
//};
//
//struct S2
//{
//	int i;
//	char c1;
//	char c2;
//};
//
//int main()
//{
//	printf("%d\n", sizeof(struct S1));//12
//	printf("%d\n", sizeof(struct S2));//8
//
//	//可以计算结构体成员相较于结构体起始位置的偏移量
//	printf("%d\n", offsetof(struct S1, c1));//0
//	printf("%d\n", offsetof(struct S1, i));//4
//	printf("%d\n", offsetof(struct S1, c2));//8
//
//	return 0;
//}





//#include <stdio.h>
//
//struct S3
//{
//	double d;
//	char c;
//	int i;
//};
//
//struct S4
//{
//	char c1;
//	struct S3 s3;
//	double d;
//};
//
//int main()
//{
//	printf("%d\n", sizeof(struct S3));//16
//	printf("%d\n", sizeof(struct S4));//32
//
//	return 0;
//}





//#include <stdio.h>
//#include <stddef.h>
//
//struct S
//{
//	char c;
//	int arr[4];
//};
//
//int main()
//{	
//	printf("%d\n", offsetof(struct S, arr[0]));//4
//	printf("%d\n", offsetof(struct S, arr[1]));//8
//	printf("%d\n", offsetof(struct S, arr[2]));//12
//	printf("%d\n", offsetof(struct S, arr[3]));//16
//	printf("%d\n", sizeof(struct S));//20
//
//	return 0;
//}




//#include <stdio.h>
//
//#pragma pack(8)//设置默认对齐数为8
//
//struct S1
//{
//	char c1;
//	int i;
//	char c2;
//};
//
//#pragma pack()//取消设置的默认对齐数，还原为默认
//
//#pragma pack(1)//设置默认对齐数为1
//
//struct S2
//{
//	char c1;
//	int i;
//	char c2;
//};
//
//#pragma pack()//取消设置的默认对齐数，还原为默认
//
//int main()
//{
//	printf("%d\n", sizeof(struct S1));//12
//	printf("%d\n", sizeof(struct S2));//6
//
//	return 0;
//}






//#include <stdio.h>
//
//struct S
//{
//	int data[100];
//	int num;
//};
//
//void print1(struct S tmp)
//{
//	printf("%d\n", tmp.num);
//}
//
//void print2(const struct S* ps)
//{
//	printf("%d\n", ps->num);
//}
//
//int main()
//{
//	struct S s = { { 1, 2, 3 }, 100 };
//	print1(s);
//	print2(&s);
//
//	return 0;
//}






//#include <stdio.h>
//
////00
////01
////10
////11
////比如_a只有这四种取值，那么只需要两个比特位就可以解决，就不需要一个整型那么大的空间了
//
//struct A
//{
//	int _a : 2;//二进制位
//	int _b : 5;
//	int _c : 10;
//	int _d : 30;
//};
//
//int main()
//{
//	printf("%d\n", sizeof(struct A));//8
//
//	return 0;
//}






//#include <stdio.h>
//
//struct S
//{
//	char a : 3;
//	char b : 4;
//	char c : 5;
//	char d : 4;
//};
//
//int main()
//{
//	struct S s = { 0 };
//	s.a = 10;
//	s.b = 12;
//	s.c = 3;
//	s.d = 4;
//	printf("%d\n", sizeof(s));//3
//
//	return 0;
//}






//#include <stdio.h>
//
//enum Color
//{
//	RED,
//	GREEN,
//	BLUE
//};
//
//int main()
//{
//	enum Color c = GREEN;
//
//	printf("%d\n", RED);//0
//	printf("%d\n", GREEN);//1
//	printf("%d\n", BLUE);//2
//
//	return 0;
//}



//#include <stdio.h>
//
//enum Color
//{
//	RED = 4,
//	GREEN,
//	BLUE
//};
//
//int main()
//{
//	printf("%d\n", RED);//4
//	printf("%d\n", GREEN);//5
//	printf("%d\n", BLUE);//6
//
//	return 0;
//}



//#include <stdio.h>
//
//enum Color
//{
//	RED,
//	GREEN = 8,
//	BLUE
//};
//
//int main()
//{
//	printf("%d\n", RED);//0
//	printf("%d\n", GREEN);//8
//	printf("%d\n", BLUE);//9
//
//	return 0;
//}




//#include <stdio.h>
//
//enum Color
//{
//	RED = 4,
//	GREEN = 8,
//	BLUE = 1
//};
//
//int main()
//{
//	printf("%d\n", RED);//4
//	printf("%d\n", GREEN);//8
//	printf("%d\n", BLUE);//1
//
//	return 0;
//}






//#include <stdio.h>
//
//union Un
//{
//	char c;
//	int i;
//};
//
//int main()
//{
//	printf("%d\n", sizeof(union Un));//4
//
//	union Un un = { 0 };
//
//	printf("%p\n", &un);
//	printf("%p\n", &un.i);
//	printf("%p\n", &un.c);
//
//	un.i = 0x11223344;
//	un.c = 0x55;
//
//	return 0;
//}





//#include <stdio.h>
//
//union Un
//{
//	int i;
//	char c;
//};
//
//int main()
//{
//	union Un u = { 0 };
//	u.i = 1;
//
//	if (1 == u.c)
//	{
//		printf("小端\n");
//	}
//	else
//	{
//		printf("大端\n");
//	}
//
//	return 0;
//}






//#include <stdio.h>
//
//int check_sys()
//{
//	union
//	{
//		int i;
//		char c;
//	}un = { .i = 1 };
//
//	return un.c;
//}
//
//int main()
//{
//	int ret = check_sys();
//
//	if (1 == ret)
//	{
//		printf("小端\n");
//	}
//	else
//	{
//		printf("大端\n");
//	}
//
//	return 0;
//}





#include <stdio.h>

union Un1
{
	char c[5];//1 8 1         5
	int i;//4 8 4
};

union Un2
{
	short c[7];//2 8 2         14
	int i;//4 8 4
};

int main()
{
	printf("%d\n", sizeof(union Un1));//8
	printf("%d\n", sizeof(union Un2));//16

	return 0;
}